如何编写一个Makefile文件(手把手的教你)

您所在的位置:网站首页 zblog 插件里面的设置保存在哪里 如何编写一个Makefile文件(手把手的教你)

如何编写一个Makefile文件(手把手的教你)

2024-07-01 15:48:16| 来源: 网络整理| 查看: 265

如果有帮助,希望点赞支持,我会更有创作的动力哦

目录 一、概念理解(彩蛋藏在某个地方)1.1 什么是Makefile?1.2 为何使用Makefile? 二、实战代码演示与讲解2.1 没有makefile的项目是怎么创建运行的2.1.1 创建文件2.1.2 查看创建的文件2.1.3 给创建的文件放一点内容2.1.4 编译运行 2.2 有makefile的项目如何创建运行2.2.1 删掉自动生成的a.out文件2.2.2 创建makefile2.2.3 执行makefile文件2.2.4 查看目录并运行可执行文件 三、代码优化3.1 添加clean信息3.2 简化makefile信息3.2.1 简化第一版3.2.2 简化第二版3.2.3 简化第三版 四、总结一下

【针对评论 hj_try_1991 2022.08.08留言,文中个别书写错误已修正(2022/11/15)】

一、概念理解(彩蛋藏在某个地方) 1.1 什么是Makefile?

C语言中,我们使用visual studio开发软件时候,写程序开始时候都会创建一个project项目文件,然后在文件里面编译 .h 和 .c 的文件。

在Linux中,有一个叫make的东西,就相当于C语言的集成开发环境,我们只需要在make里面创建文件,写代码,make会帮我们管理这些文件。

不过我们创建的项目不叫project,而是称为Makefile,打开一个make源程序包,发现很多Makefile的文件,说明里面有很多的项目。

在源程序包里面,也有名为makefile的文件(m是小写),两个命名同时存在,这是合理的,在开发一个项目的时候,工程师一般都会命名为Makefile然后打包交给用户,用户觉得某个Makefile需要改动,用户改动后或者新建后的项目定义为makefile,并且在运行时候,先执行makefile,再执行Makefile文件。

1.2 为何使用Makefile? 上面提到需要将我们写的大量项目文件管理起来,这里具体讲讲:在这里插入图片描述 这个树形图展示了一个项目中的层级关系,如果我们需要变动3号文件,会发现,牵一发而动全身,改动一个被迫需要改动一堆,为了解放我们,make中编写Makefile就不再需要考虑这些,你把每个文件的依赖关系以指令的形式说明清楚并且保存下来,改动一个即可,会自动帮你修改关联到的其他文件。 二、实战代码演示与讲解 2.1 没有makefile的项目是怎么创建运行的 2.1.1 创建文件 touch main.c tool1.c tool1.h tool2.c tool2.h

在这里插入图片描述

使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件"file",输入如下命令: $ touch file #创建一个名为“file”的新的空白文件**

2.1.2 查看创建的文件

要有优秀的编程习惯,创建完了之后看一下时候创建成功

ls

在这里插入图片描述

ls 查看当前目录下的文件,发现成功创建了5个文件。

2.1.3 给创建的文件放一点内容 vim * -p

在这里插入图片描述

vim就是进入文本编辑的命令,按键 i 进入编辑模式,Esc退出编辑模式,:wq 保存退出到终端界面

"tool1.h" #ifndef TOOL1_H__ #define TOOL1_H__ # 声明函数 void mytoo1(void); #endif "tool1.c" #include #incldue "tool1.h" # 定义函数 void mytool1(void) { printf("tool1 print\n"); }

在这里插入图片描述 只需要稍微修改一下 tool2.h 和 tool2.c 的文件就好啦。

"tool2.h" #ifndef TOOL2_H__ #define TOOL2_H__ # 声明函数 void mytoo2(void); #endif "tool1.c" #include #incldue "tool2.h" # 定义函数 void mytool2(void) { printf("tool2 print\n"); }

现在还剩下一个主函数main了,测试代码如下

#include #include "tool1.h" #include "tool2.h" int main(){ mytool1(); mytool2(); return 0; }

:wa退出编辑模式(保存所有打开的文件)

2.1.4 编译运行

在这里插入图片描述

2.2 有makefile的项目如何创建运行

makeile教学视频 讲前小科普:在这里插入图片描述

2.2.1 删掉自动生成的a.out文件 rm a.out

在这里插入图片描述

2.2.2 创建makefile

vim进入编辑模式,系统检测没有名为makefile的文件,会自动创建。 如果自己想自定义一个其他名字,比如makefilebuff-demo,可能在make操作时候会有影响。下面会讲。 在这里插入图片描述

接下来的写依赖关系的时候,你可能会疑惑gcc命令的一些参数,nb我已经预判到了,我的这篇文章可以帮你解决一小部分疑惑 Linux——gcc -c -o 等参数的解释.

# 自定义依赖关系,源文件(后缀为.c)经过编译汇编生成目标文件(后缀为.o) # 目标文件执行生成可执行文件(类似与mytool) mytool:main.o tool1.o tool2.o # 写gcc命令时候,前面要tab按键一下 # 不写-o参数,生成默认的可执行文件名为a.out,这里我们修改为mytool gcc main.o tool1.o tool2.o -o mytool main.o:main.c #-Wall 可以看到所有的警告 #-g 可以调试 #-c 只允许执行到汇编步骤,不允许链接。 gcc main.c -c -Wall -g -o main.o tool1.o:tool1.c gcc tool1.c -c -Wall -g -o tool1.o tool2.o:tool2.c gcc tool2.c -c -Wall -g -o tool2.o

在这里插入图片描述 保存退出,然后查看一下目录(好习惯),发现有一个makefile的文件啦。 在这里插入图片描述

2.2.3 执行makefile文件

直接使用make命令 在这里插入图片描述

科普:如果你的文件名字不是makefile,而是makefilebuff-demo这样自定义的,那么需要这么操作 make -f makefilebuff-demo

make 命令可以通过 -f 执行使用的makefile。

如果在没有使用 -f 指定的情况下,会按照下面的顺序执行。

GNUmakefile, makefile 和 Makefile

2.2.4 查看目录并运行可执行文件

可以看到可执行文件已经是其他颜色了,颜色不同代表这文件权限不同。 (./文件名)运行! 在这里插入图片描述 第一阶段就可以完结撒花啦!!!!!

实际上,这里的makefile文件的信息写的并不是十分的规范,有的东西还没有写,有的写的太麻烦。接下来逐步完善一下

三、代码优化 3.1 添加clean信息

_实际上,正如上面介绍的流程我们已经基本处理完了项目,这个时候我修改了某文件代码保存退出后,就需要重新的执行make指令,但是跟第一次不同的是,这次make指令执行后界面如图,不再展示依赖和被依赖关系。 在这里插入图片描述

_但是我们还是希望每次执行make,都展示一下依赖和被依赖关系,需要添加 clean 信息

clean: # rm 删除指令,删除所有后缀为.o文件,删除mytool这个可执行文件 # -rf 强制删除并且递归删除,否则的话会一直询问我们是否需要删除 rm *.o mytool -rf

在这里插入图片描述 执行make clean,发现出现了依赖和被依赖的关系 在这里插入图片描述

3.2 简化makefile信息 3.2.1 简化第一版 # OBJS 代替 依赖文件 # CC 代替 gcc # CFLAGS 代替 编译命令 OBJS=main.o tool1.o tool2.o CC=gcc CFLAGS=-c -Wall -g mytool:$(OBJS) $(CC) $(OBJS) -o mytool main.o:main.c $(CC) main.c $(CFLAGS) -o main.o tool1.o:tool1.c $(CC) tool1.c $(CFLAGS) -o tool1.o tool2.o:tool2.c $(CC) tool2.c $(CFLAGS) -o tool2.o clean: rm *.o mytool -rf 3.2.2 简化第二版 # $^ 代替 上面的指令 # RM 代替 rm -f # $@ 代替 目标文件 OBJS=main.o tool1.o tool2.o CC=gcc CFLAGS=-c -Wall -g mytool:$(OBJS) $(CC) $^ -o mytool main.o:main.c $(CC) $^ $(CFLAGS) -o $@ tool1.o:tool1.c $(CC) $^ $(CFLAGS) -o $@ tool2.o:tool2.c $(CC) $^ $(CFLAGS) -o $@ clean: $(RM) *.o mytool -r

这个 $(RM) 运行下来可以看到,替代了 rm和 -f 在这里插入图片描述

3.2.3 简化第三版 # 6-11行代码相似性很强,可以提取出一个公式模版 # %.o:%.c # $(CC) $^ $(CFLAGS) -o $@ # 百分号相当于一个通配符 OBJS=main.o tool1.o tool2.o CC=gcc CFLAGS=-c -Wall -g mytool:$(OBJS) $(CC) $^ -o mytool %.o:%.c $(CC) $^ $(CFLAGS) -o $@ clean: $(RM) *.o mytool -r

在这里插入图片描述

四、总结一下

这次从零开始接触makefile,先查阅文本资料简单的接触一下makefile,留下了印象是好难读懂什么意思,痛苦几天后找到和视频资料并且写下了这篇总结,基本上可以对makefile有个较为全面的认识。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭